function [ finished ] = spin_msg_star( spin_cur_node )

    global nodes_count;
    global S_Map;             % Sensors map (see put_sensors.m)
    global D_Map;             % Distances map (see put_sensor.m)
    global N_Map;             % Neighbours map (see neighbouring.m)
    global radio_range;
    global random_color;
    global emit_energy;
    global recv_energy;
    global emit_meta_energy;
    global recv_meta_energy;
    
    %{
    
    finished = 1; %wartosc poczatkowa nieznana
    
    if(spin_energy_send(spin_cur_node)) %sprawdzam czy wystarczy energi na rozeslanie danych
    
    S_Map(spin_cur_node,8) = 1; %zaznaczam, �e ju� rozes�a�em dane    
  
    %energia za wyslanie pakietu ADV
    spin_check_energy(spin_cur_node,emit_meta_energy);
    
    %Wyslam w swiat wiadomosc metadata ADV (widza ja tylko s�siedzi)
    for i=2:N_Map(spin_cur_node,1,1)+1 %petla po sasiadach
       if(N_Map(spin_cur_node,i,1)~=0) % wykryj ze jest SB
           
            %starcz czy wystarczy energi na caly algorytm odbioru
            if(spin_energy_recv(N_Map(spin_cur_node,i,1)))
                break;
            else
                %energia za odebranie pakietu ADV kazdy s�siad
                spin_check_energy(N_Map(spin_cur_node,i,1),recv_meta_energy);
            end;
            
       %     draw_line_f1(spin_cur_node, nodes_count+1, [ 1.0 0 0] ); % polaczenie z SB
       %else           
       %     draw_line_f1(spin_cur_node, N_Map(spin_cur_node,i,1), [ 1.0 0 0] );
       end;
    end;
    
    %Czy juz mam te dane? Jesli nie to wysylam REQ
    for i=2:N_Map(spin_cur_node,1,1)+1 %petla po sasiadach
        if(N_Map(spin_cur_node,i,1)~=0) %dla wez��w
            %Nie mam danych - wysylam REQ
            if(S_Map(N_Map(spin_cur_node,i,1),7) == 0)
            
                %energia za odebranie pakietu REQ                
                spin_check_energy(spin_cur_node,recv_meta_energy);
                
                %energia za wyslanie pakietu REQ
                spin_check_energy(N_Map(spin_cur_node,i,1),emit_meta_energy);
                
            %tylko pierwszy - reszta juz automatycznie odbiera dane bo wezel nadaje w "eter" - brodcast
            break;
            %if(N_Map(spin_cur_node,i,1)==0) % wykryj ze jest SB
            %    draw_line_f1(spin_cur_node, nodes_count+1, [ 0 1.0 0] ); % polaczenie z SB
            %else           
            %    draw_line_f1(spin_cur_node, N_Map(spin_cur_node,i,1), [ 0 1.0 0] );
            %end;
            end;
        end;
    end;
    
    %Rozsylam pakiet DATA do wszystykich zainteresowanych

    %energia za wys�anie pakietu DATA tylko raz w eter - brodcast
    spin_check_energy(spin_cur_node,emit_energy);
    
    for i=2:N_Map(spin_cur_node,1,1)+1 %petla po sasiadach
        %dla wezlow
        if(N_Map(spin_cur_node,i,1) ~= 0)
            if(S_Map(N_Map(spin_cur_node,i,1),7) == 0 && S_Map(N_Map(spin_cur_node,i,1),3) > 0) %jesli nie mam danych to odbierz
                %energia za odbieranie pakietu DATA
                if(~spin_check_energy(N_Map(spin_cur_node,i,1),recv_energy))
                    %zaznaczam, �e juz mam DATA tylko w wypadku jak starczy
                    %energi na odbi�r danych
                    S_Map(N_Map(spin_cur_node,i,1),7) = 1; 
                end;
            end;
        %dla bazy
        else
            if(S_Map(nodes_count+1,7) == 0) %jesli nie mam danych to odbierz
                S_Map(nodes_count+1,7) = 1; %zaznaczam, �e juz mam DATA
                draw_line_f1(spin_cur_node, nodes_count+1, random_color ); % polaczenie z SB
                finished = 0;
            end;
        end;
    end;  
   
    end; %koniec sprawdzania czy wytrzyma energie
   %}
    
    finished = 1; %sprawdzenie czy doszla wiadomosci do BSa
    
    sended_adv = false; %czy pakiet adv wyslany w eter
    recived_req = false; %czy pakiet req odebrany
    sended_data = false; %czy pakiet data wyslany w eter
    
    b = spin_energy_send(spin_cur_node);
    %disp(sprintf('Wezel %d: energia na rozeslanie = %d', spin_cur_node,b));
    if(b) %sprawdzam czy wystarczy energi na rozeslanie danych
    
    %wysylam w swiat ADV
    spin_check_energy(spin_cur_node,emit_meta_energy);
    %tylko raz i zaznaczam
    sended_adv = true;
        
        for i=2:N_Map(spin_cur_node,1,1)+1 %petla po sasiadach
            %sprawdz czy sasiad to baza
            if(N_Map(spin_cur_node,i,1) ~= 0)
                %obsluga czujnika
                %disp(sprintf('\tS�siad %d: energia na odbior = %d', N_Map(spin_cur_node,i,1),spin_energy_recv(N_Map(spin_cur_node,i,1))));
                if(spin_energy_recv(N_Map(spin_cur_node,i,1)))
                   %obsluga tylko tych ktore jeszcze nie maja
                   if(S_Map(N_Map(spin_cur_node,i,1),7) == 0 )
                       
                    if(~recived_req)
                        %tylko pierwszy sasiad wysyla REQ
                        spin_check_energy(N_Map(spin_cur_node,i,1),emit_meta_energy);
                        recived_req = true;
                        %odpowiada mu data odrazu
                        spin_check_energy(spin_cur_node,emit_energy);
                        sended_data = true;
                    end;
                    
                    if(sended_data)
                        %odbiera dane sasiad jak s� w powietrzu
                        spin_check_energy(N_Map(spin_cur_node,i,1),recv_energy);
                        %zaznaczam ze juz ma dane
                        S_Map(N_Map(spin_cur_node,i,1),7) = 1;
                        %rysuje dane tylko tam gdzie zaznaczam ze dotarly
                        %draw_line_f1(spin_cur_node, N_Map(spin_cur_node,i,1), random_color );
                    end;
                    
                   end;
                
                end;
            else
                if(S_Map(nodes_count+1,7) == 0)
                %obsluga bazy tylko jesli danych jeszcze nie ma
                    %draw_line_f1(spin_cur_node, nodes_count+1, random_color ); % polaczenie z SB
                    %disp(sprintf('\tBaza %d: energia na odbior = zawsze', N_Map(spin_cur_node,i,1)));
                    finished = 0;
                    S_Map(nodes_count+1,7) = 1;
                end;
            end;            
        end;        
        
        S_Map(spin_cur_node,8) = 1; %zaznaczam, �e ju� rozes�a�em dane;
        
    end;
    
end

function [ ene ] = spin_check_energy( node, energia )

    global S_Map;             % Sensors map (see put_sensors.m)
    global nodes_count;
        
    if(node ==0)
        node = nodes_count + 1;
    end;
    
    wynik = S_Map(node,3) - energia;
    if(wynik <= 0)
        ene = true;
        S_Map(node,3) = 0; %czujnik nie ma energi
        spin_dead_node(node);
    else
        ene = false;
        S_Map(node,3) = wynik; %zapisz wynik zuzycia energi
    end;

end

function [ ene ] = spin_energy_recv( node )

    global S_Map;             % Sensors map (see put_sensors.m)
    global emit_energy;
    global recv_energy;
    global emit_meta_energy;
    global recv_meta_energy;
    global nodes_count;
        
    if(node ==0)
        node = nodes_count + 1;
    end;
    
    energia = S_Map(node,3);
    
    %symulacja pelenego wykorzystania energi
    
    energia = energia - recv_meta_energy;   %odebranie ADV
    energia = energia - emit_meta_energy;   %wys�anie REQ
    energia = energia - recv_energy;        %odebranie DATA
    
    if(energia > 0) %jak wytrzyma to true
        ene = true;
    else
        ene = false;
        S_Map(node,3) = 0; % jak nie starczy to go wy��czamy
        spin_dead_node(node);
    end;    
end

function [ ene ] = spin_energy_send( node )

    global S_Map;             % Sensors map (see put_sensors.m)
    global emit_energy;
    global recv_energy;
    global emit_meta_energy;
    global recv_meta_energy;
    global nodes_count;
        
    if(node ==0)
        node = nodes_count + 1;
    end;
    
    energia = S_Map(node,3);
    %disp(energia);
    
    %symulacja pelenego wykorzystania energi
    
    energia = energia - emit_meta_energy;   %wyslanie ADV
    energia = energia - recv_meta_energy;   %odebranie REQ
    energia = energia - emit_energy;        %wyslanie DATA
    
    %disp(energia);
   
    if((energia) > 0) %jak wytrzyma to true
        ene = true;
    else
        ene = false;
        S_Map(node,3) = 0; % jak nie starczy to energia = 0
        S_Map(node,5) = 0; % i go wy��czamy
        spin_dead_node(node);
    end;    
end

function spin_dead_node( node )
    global S_Map;             % Sensors map (see put_sensors.m)
    
    if(S_Map(node,3) == 0)
        plot3(S_Map(node,1),S_Map(node,2),300,'black.');
    end;
    
end

